'''
-*-  coding:  utf-8  -*-
Time    : 15:32
Auther  :罗老师
File    :basepage.py
'''

from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver.support.wait import WebDriverWait
from appium.webdriver.common.mobileby import MobileBy


class BasePage:

    def __init__(self, driver):
        self.driver = driver

    def locator(self, loc):
        """
        元素定位的方法,是其他方法的基础方法，一般不直接调用
        loc: 传入一个元组，参数1代表元素定位的方式，参数2代表对应的值
        """
        a = MobileBy.XPATH
        if loc[0] == "MobileBy.ID":
            a = MobileBy.ID
        elif loc[0] == "MobileBy.CLASS_NAME":
            a = MobileBy.CLASS_NAME

        return self.driver.find_element(a, loc[1])

    def input(self, loc, value):
        """
        找到对应的元素然后，输入目标值
        """
        self.locator(loc).send_keys(value)

    def click(self, loc):
        """
        定位元素然后执行点击
        """
        self.locator(loc).click()

    def swip(self, start_x, start_y, end_x, end_y, num, duration=1000):
        """
        这是一个页面指定划定次数的上下左右滑动的参数，
        start_x: X轴的倍数
        start_y: Y轴的倍数
        end_x: X轴的倍数
        end_y: Y轴的倍数
        num: 滑动的次数
        duration： 滑动的时间间隔
        """
        # 获取屏幕大小
        window_size = self.driver.get_window_size()
        x = window_size["width"]
        y = window_size["height"]
        for i in range(num):
            self.driver.swipe(x * start_x,
                              y * start_y,
                              x * end_x,
                              y * end_y,
                              duration=duration)

    def long_click(self, loc, num=1000):
        """
        这是一个执行将指定元素长压 num（ms） 时间的操作
        loc： 定位方法、和定位置
        num：需要压住的时间，默认是1秒
        """
        Touch = TouchAction(self.driver)
        ele = self.locator(loc)
        Touch.long_press(ele, num).perform()

    def uncoke_click(self, loc1, loc2, num=100):
        """
        这是一个从长压元素1 num时间后 滑动到元素2 的执行操作
        loc1: 元素1的定位 或者使用坐标
        loc2: 元素2的定位 或者使用坐标
        num: 长压的时间
        """
        a = loc1[1]
        Touch = TouchAction(self.driver)
        if type(a) == "int":
            Touch.press(loc1[0], loc1[1]).wait(num).move_to(loc2[0], loc2[1]).release().perform()
        else:
            ele = self.locator(loc1)
            ele_1 = self.locator(loc2)
            Touch.press(ele).wait(num).move_to(ele_1).release().perform()

    def toast_check(self, nums=10, num=0.1, lob=None):
        """
        这是一个使用显示等待的方式获取屏幕toast弹窗后返回的方法
        nums: 等待总时间
        num: 每一次监听的时间间隔
        loc: 定位元素的值
        """
        ele = WebDriverWait(self.driver, nums, num).until(lambda x: self.locator(lob))
        return ele

    def is_asster(self, loc):
        """
        判断元素是否正常显示
        """
        return self.locator(loc).is_displayed()
